//  Copyright Druid Mechanics

#pragma once

#include "CoreMinimal.h"
#include "Abilities/Tasks/AbilityTask.h"
#include "TargetDataUnderMouse.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMouseTargetDataSignature, const FGameplayAbilityTargetDataHandle&,
                                            DataHandle);

/**
 * 
 */
UCLASS()
class AURA_API UTargetDataUnderMouse : public UAbilityTask
{
	GENERATED_BODY()
	/**
	 * HidePin = "OwningAbility": 表示在蓝图中隐藏针脚。
	 * DefaultToSelf = "OwningAbility": 在蓝图中会有默认自身(self)引用，这是默认将自身(self)引用作为参数传入，这个OwningAbility是参数，在这个函数里是UGameplayAbility* OwningAbility。
	 * BlueprintInternalUseOnly: 此函数是一个内部实现细节，用于实现另一个函数或节点(工厂函数)。它永远不会直接暴露在图表中，意思是如果你想从蓝图看函数是怎么实现的，不会跳转到C++代码内部。
	 * 另外，此函数将作为工厂函数，在此类中定义的变量(目前只知道变量)都会以引脚的方式暴露出去。
	 * UFUNCTION(BlueprintCallable, Category = "Ability|Tasks", meta = (DisplayName = "TargetDataUnderMouse", HidePin = "OwningAbility", DefaultToSelf = "OwningAbility"))
	 * 可认为这个是自定义任务的工厂函数的固定格式，一定要这么用才能触发游戏玩法任务。
	 */
	UFUNCTION(BlueprintCallable, Category = "Ability|Tasks",
		meta = (DisplayName = "TargetDataUnderMouse", HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = true))
	static UTargetDataUnderMouse* CreateTargetDataUnderMouse(UGameplayAbility* OwningAbility);

	UPROPERTY(BlueprintAssignable)
	FMouseTargetDataSignature ValidData;

private:
	/**
	 * 在代理设置完成后，此函数会被调用以触发实际任务。
	 * NOTE: 应该是此游戏任务被激活时就触发此函数。
	 */
	virtual void Activate() override;

	void SendMouseCursorData();

	void OnTargetDataReplicatedCallback(const FGameplayAbilityTargetDataHandle& DataHandle, FGameplayTag ActivationTag);
};
